/*
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.lang;

import java.lang.annotation.*;

/**
 * 用于指示接口类型声明旨在成为 Java 语言规范定义的<i>函数式接口</i>的信息性注解类型。
 *
 * 从概念上讲，函数式接口恰好有一个抽象方法。
 * 由于{@linkplain java.lang.reflect.Method#isDefault() 默认方法}有实现，
 * 它们不是抽象的。如果接口声明了一个抽象方法来重写 {@code java.lang.Object}
 * 的公共方法之一，那么这也<em>不</em>计入接口的抽象方法计数，
 * 因为接口的任何实现都将具有来自 {@code java.lang.Object} 或其他地方的实现。
 *
 * <p>请注意，函数式接口的实例可以通过 lambda 表达式、方法引用或构造方法引用来创建。
 *
 * <p>如果类型使用此注解类型进行注解，编译器需要生成错误消息，除非：
 *
 * <ul>
 * <li> 该类型是接口类型，而不是注解类型、枚举或类。
 * <li> 被注解的类型满足函数式接口的要求。
 * </ul>
 *
 * <p>但是，编译器将把任何符合函数式接口定义的接口视为函数式接口，
 * 无论接口声明上是否存在 {@code FunctionalInterface} 注解。
 *
 * @jls 4.3.2. The Class Object
 * @jls 9.8 Functional Interfaces
 * @jls 9.4.3 Interface Method Body
 * @since 1.8
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
